package com.shen.pc;

/**
 * synchronized版生产者消费者问题
 */
public class SyncPC {
    public static void main(String[] args) {
        Data data=new Data();
        new Thread(
                ()->{
                    for (int i = 0; i <10 ; i++) {
                        try {
                            data.increment();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
      ,"A"  ).start();

        new Thread(
                ()->{
                    for (int i = 0; i <10 ; i++) {
                        try {
                            data.decrement();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
                ,"B"  ).start();
        new Thread(
                ()->{
                    for (int i = 0; i <10 ; i++) {
                        try {
                            data.increment();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
                ,"C"  ).start();

        new Thread(
                ()->{
                    for (int i = 0; i <10 ; i++) {
                        try {
                            data.decrement();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
                ,"D"  ).start();



    }
}

//判断 等待 业务 通知
class Data{
    private int number=0;

    //+1
    public synchronized void increment() throws InterruptedException {
        while (number!=0){//判断
            //等待
            this.wait();
        }
        number++;//业务
        System.out.println(Thread.currentThread().getName()+"==>"+number);
        //通知
        this.notify();
    }

    //-1
    public synchronized void decrement() throws InterruptedException {
        while(number==0){//判断
            //等待
            this.wait();
        }
        number--;//业务
        System.out.println(Thread.currentThread().getName()+"==>"+number);
        //通知
        this.notify();
    }
}
